using System;
using System.Collections.Generic;
using System.Linq;
using Csla;
using Csla.Data;
using Presupuestos.Datos;

namespace Presupuestos.Negocio.SoloLectura
{
    [Serializable]
    public class UsuarioInfoList :
      ReadOnlyListBase<UsuarioInfoList, UsuarioInfo>
    {

        #region Factory Methods

        public static UsuarioInfoList GetUsuarioInfoList(Filtros filter)
        {
            return DataPortal.Fetch<UsuarioInfoList>(filter);
        }

        public static UsuarioInfoList GetUsuarioInfoList()
        {
            return DataPortal.Fetch<UsuarioInfoList>(new Filtros());
        }

        private UsuarioInfoList()
        { /* require use of factory methods */ }

        #endregion

        #region Filtros
        [Serializable()]
        public class Filtros
        {
            public Filtros()
            { //Sin Filtros 
            }

            private String m_Nombre;
            public String Nombre
            {
                get { return m_Nombre; }
                set { m_Nombre = value; }
            }


            private String m_Descripcion;
            public String Descripcion
            {
                get { return m_Descripcion; }
                set { m_Descripcion = value; }
            }

        }
        #endregion

        #region Data Access

        private void DataPortal_Fetch(Filtros crit)
        {
            RaiseListChangedEvents = false;
            IsReadOnly = false;

            using (var ctx = ObjectContextManager<PresupuestosEntities>.
                GetManager("PresupuestosEntities"))
            {
                var lista = from usr in ctx.ObjectContext.Usuarios
                            where usr.EstadoRegistro == true
                            select usr;

                if (!String.IsNullOrEmpty(crit.Nombre))
                    lista = from usr in ctx.ObjectContext.Usuarios
                            where usr.NombreUsuario.Contains(crit.Nombre)
                            && usr.EstadoRegistro == true
                            select usr;

                if (!String.IsNullOrEmpty(crit.Descripcion))
                    lista = from usr in ctx.ObjectContext.Usuarios
                            where usr.Descripcion.Contains(crit.Descripcion)
                            && usr.EstadoRegistro == true
                            select usr;

                foreach (var item in lista)
                    base.Add(UsuarioInfo.GetUsuarioInfo(item));

            }

            IsReadOnly = true;
            RaiseListChangedEvents = true;
        }

        #endregion
    }
}
